#!/usr/bin/env python3
"""
详细解释特征重要性与模型选择的关系
"""

def explain_model_importance():
    """解释特征重要性与模型选择的关系"""
    
    print("=" * 80)
    print("特征重要性与模型选择的关系详解")
    print("=" * 80)
    
    print("\n🎯 核心答案: 是的，特征重要性的值与预测时选择的模型密切相关！")
    
    print("\n📊 不同模型的特征重要性差异:")
    
    # 1. 模型类型差异
    print("\n1. 模型类型差异:")
    print("   🔹 LightGBM模型:")
    print("      - 基于梯度提升决策树")
    print("      - 特征重要性基于分裂增益")
    print("      - 对历史负荷特征更敏感")
    print("      - 可能显示: 历史负荷 95%, 气象因素 4%, 时间特征 1%")
    
    print("   🔹 XGBoost模型:")
    print("      - 基于梯度提升决策树")
    print("      - 特征重要性基于覆盖度和增益")
    print("      - 对特征交互更敏感")
    print("      - 可能显示: 历史负荷 94%, 气象因素 5%, 时间特征 1%")
    
    print("   🔹 Ensemble模型:")
    print("      - 多个模型的加权平均")
    print("      - 特征重要性是各模型重要性的加权组合")
    print("      - 更稳定和平衡的结果")
    print("      - 当前显示: 历史负荷 96.4%, 气象因素 3.6%, 时间特征 0.1%")
    
    # 2. 数据来源差异
    print("\n2. 数据来源差异:")
    print("   🔹 单模型特征重要性:")
    print("      - 直接从模型文件获取")
    print("      - 来源: backend/models/saved_models/")
    print("      - 文件: lightgbm_model.pkl, xgboost_model.pkl")
    print("      - 反映该模型的学习结果")
    
    print("   🔹 Ensemble模型特征重要性:")
    print("      - 从数据库获取历史数据")
    print("      - 来源: feat_imp表")
    print("      - 计算多个模型的平均重要性")
    print("      - 反映集成模型的综合结果")
    
    # 3. 计算方式差异
    print("\n3. 计算方式差异:")
    print("   🔹 单模型计算:")
    print("      - 直接使用model.feature_importances_")
    print("      - 基于该模型的训练结果")
    print("      - 反映该模型的特定学习模式")
    
    print("   🔹 Ensemble模型计算:")
    print("      - 从数据库获取最近100条特征重要性记录")
    print("      - 计算平均值: avg_importance[feat] = mean(values)")
    print("      - 映射到标准特征名称")
    print("      - 反映多个模型的综合学习结果")
    
    # 4. 实际影响
    print("\n4. 实际影响:")
    print("   🔹 模型选择影响特征重要性:")
    print("      - 选择lightgbm: 可能更重视历史负荷")
    print("      - 选择xgboost: 可能更重视特征交互")
    print("      - 选择ensemble: 平衡各模型的结果")
    
    print("   🔹 特征重要性影响预测策略:")
    print("      - 高历史负荷重要性: 更依赖历史数据")
    print("      - 高气象因素重要性: 更关注天气变化")
    print("      - 高时间特征重要性: 更重视周期性模式")
    
    # 5. 代码实现
    print("\n5. 代码实现:")
    print("   🔹 前端模型选择:")
    print("      - config.model: 'ensemble', 'lightgbm', 'xgboost'")
    print("      - 影响API调用的模型参数")
    
    print("   🔹 后端特征重要性获取:")
    print("      - FeatureImportanceService.analyze_feature_importance()")
    print("      - 根据model_name选择不同的获取方式")
    print("      - 单模型: 从模型文件获取")
    print("      - Ensemble: 从数据库获取")
    
    # 6. 数据库存储
    print("\n6. 数据库存储:")
    print("   🔹 feat_imp表结构:")
    print("      - model: 模型名称")
    print("      - feat: 特征名称")
    print("      - imp: 重要性分数")
    print("      - train_dt: 训练日期")
    
    print("   🔹 存储策略:")
    print("      - 每次模型训练后保存特征重要性")
    print("      - 按模型名称分别存储")
    print("      - 支持历史数据查询")
    print("      - 便于ensemble模型计算")
    
    # 7. 实际示例
    print("\n7. 实际示例:")
    print("   🔹 当前系统配置:")
    print("      - 默认模型: ensemble")
    print("      - 集成权重: lightgbm 50.8%, xgboost 49.2%")
    print("      - 特征重要性: 历史负荷 96.4%, 气象因素 3.6%, 时间特征 0.1%")
    
    print("   🔹 如果切换到lightgbm:")
    print("      - 可能显示: 历史负荷 95%, 气象因素 4%, 时间特征 1%")
    print("      - 反映lightgbm模型的学习特点")
    
    print("   🔹 如果切换到xgboost:")
    print("      - 可能显示: 历史负荷 94%, 气象因素 5%, 时间特征 1%")
    print("      - 反映xgboost模型的学习特点")
    
    # 8. 技术细节
    print("\n8. 技术细节:")
    print("   🔹 特征重要性计算:")
    print("      - LightGBM: 基于分裂增益和覆盖度")
    print("      - XGBoost: 基于增益、覆盖度和频率")
    print("      - Ensemble: 加权平均各模型的重要性")
    
    print("   🔹 数据更新机制:")
    print("      - 模型训练时自动计算特征重要性")
    print("      - 保存到数据库feat_imp表")
    print("      - 前端实时获取最新数据")
    print("      - 支持不同模型的特征重要性对比")
    
    print("\n✅ 总结:")
    print("   特征重要性的值确实与预测时选择的模型密切相关。")
    print("   不同模型有不同的学习特点和算法原理，")
    print("   因此会对同一特征产生不同的重要性评估。")
    print("   Ensemble模型通过集成多个模型的结果，")
    print("   提供了更平衡和稳定的特征重要性评估。")
    
    print("\n🎯 实际应用建议:")
    print("   - 选择ensemble模型获得最平衡的特征重要性")
    print("   - 选择特定模型了解该模型的学习特点")
    print("   - 对比不同模型的特征重要性了解算法差异")
    print("   - 根据特征重要性调整预测策略")

if __name__ == "__main__":
    explain_model_importance() 